
/**
 * 定义一个函数
 * 函数名(形参类型 形参变量) {
 *     函数体
 * }
 */
printIntNumber(int number) {
  // 打印传入的number
  print("The Number is ${number}.");
}

/**
 * 文档注释
 * 程序的入口主函数
 */
void main() {
  // 输出 Hello Dart!!!
  print("Hello Dart!!!");

  /*
    Dart 是一门强类型的编程语言，所以一个变量只能保存一种类型的值
    标准定义变量的格式：变量数据类型 变量名 = 变量初始化值 // 强类型
      变量数据类型为：int String List bool 等内置类型
      Dart 支持泛型（任何类型的对象列表）, 如 List<int> 或 List<dynamic>

    推断类型：变量的类型根据首次赋值时的类型确定
      var 变量名 = 初始值;

    使用动态类型声明的变量，可以存储多个类型的数据
    dynamic 变量名 = 初始值;

    变量的默认值：
      未初始化的变量的默认值是 null，即使是数字类型的变量，类型默认值也是 null
      因为在Dart中，一切皆对象类型
      任何保存在变量中的类型都是对象，并且多有对象都有一个对应的class的实例
      无论是数字、函数和null都是对象。
      所有的对象都继承自 Object 类型 

    final 和 const
      使用过程中值始终不会改变的变量，可使用 final 或 const 声明，而不是 var
      final 变量的值只能被设置一次
      cosnt 常量的值在编译时就已经确定了

    Dart 支持的内建类型：

      Number：
        Number 有2中类型，int 整数值 和 double 64位浮点数值
      String
        字符串类型，单双引号都支持
        可使用 ${变量} 动态拼接字符串
        调用对象的 toString() 方法可以获得对象的对应字符串表示
        使用 """
              多行字符串
            """
        使用原始字符串，raw 字符串，需要在引号外添加 r 标记，可防止引号内的转义 \ 内容与字符串的转义字符冲突
      Boolean
        在 dart 中，只有 true 和 false 是bool类型
        其他值都无法隐式转换为bool类型
      集合类型
        List，也被成为 Array
        Map
          map 是一组无序的键值对集合，其中键名不能重复，值可以重复
          键和值都可以是任意类型的数据
          创建：
            var map = {
              key1: value1,
              key2: value2,
              ...
            };
          map 可以通过 变量名[key]的方式获取或修改元素的值
          访问一个Map中不存在的成员，不会报错，但是返回 null
          .length 属性可以获取map中成员的个数
        Set
          set 是一个无序的，元素唯一的集合
          因为Set是无序的，所以不能通过下标获取集合中的元素
          创建set: var 变量名 = {元素1, 元素2, ...};
          创建空set: 
            var 变量名 = <数据类型>{}; 或 Set<数据类型> 变量名 = {};
          注意： 使用 var 变量名 = {}; dart 会默认创建 map 而不是 set
          可以用 add 或 addAll 往 set 中添加元素
          Set.from(集合) 或 集合.toSet() 可以将其他类型的集合转为 set
      Rune(用于在字符串中表示Unicode字符)
      Symbol
    
   */

  // 声明一个动态类型的变量，并初始化
  dynamic number = 42;
  printIntNumber(number);

  number = "Hello"; 
  printIntNumber(number); // 打印报错： type 'String' is not a subtype of type 'int'
}
